package cn.wlh.learn.webmagic.pipeline;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpRequest;

import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;

/**
 * 抽象成URL处理下载转化内容。
 */
public abstract class BaseDownLoadConversoinPipeline extends AbstractConversionPipeline {
    /**
     * 设置读取和存入的key
     *
     * @param from
     * @param to
     */
    public BaseDownLoadConversoinPipeline(String from, String to) {
        super(from, to);
    }

    @Override
    public Object conversionOne(Object urlObj) {
        Object retObj = null;
        InputStream inputStream = null;
        URL url = null;
        try {
            if (urlObj instanceof URL) {
                url = (URL) urlObj;
                // 交给子类实现转化。
                inputStream = urlToStream(url);
            } else if (urlObj instanceof File) {
                // 如果是文件.
                File file = (File) urlObj;
                // 递归放入，交给URL处理.
//                return conversionOne(file.toURL());
                return conversionOne(file.toURI());
            } else if (urlObj instanceof URI) {
                URI uri = (URI) urlObj;
                // 递归放入，交给URL处理.
                return conversionOne(uri.toURL());
            } else {
                url = toUrl(urlObj);
                return conversionOne(url);
            }
            // 交给子类实现具体存储。
            retObj = downLoadStore(inputStream, url);
        } catch (Exception e) {
            // 转化一下异常。
            throw new RuntimeException(e);
        } finally {
            IoUtil.close(inputStream);
        }
        return retObj;
    }

    protected URL toUrl(Object urlObj) {
        // 获得安全的字符串
        String str = StrUtil.utf8Str(urlObj);
        // 获得安全的协议。
        URL url = URLUtil.url(str);
        return url;
    }

    /**
     * 交给子类实现具体存储。
     * 不需要关闭inputStream。
     * 用完会关闭。
     *
     * @param inputStream
     * @param url
     * @return
     * @throws Exception
     */
    protected abstract Object downLoadStore(InputStream inputStream, URL url) throws Exception;

    /**
     * form里面的对象，执行这个转化的入口。
     * 子类可以重写，增强。
     *
     * @param url
     * @return
     * @throws Exception
     */
    protected InputStream urlToStream(URL url) throws Exception {
        // 获得协议模式 :
        String protocol = url.getProtocol();
        InputStream inputStream = null;
        switch (protocol) {
            case "https":
            case "http":
                inputStream = HttpRequest.get(url.toString()).setFollowRedirects(true).executeAsync().bodyStream();
                break;
            case "file":
                // 用文件打开。
                File file = FileUtil.file(url);
                inputStream = IoUtil.toStream(file);
                break;
            default:
                // 默认打开
                inputStream = url.openStream();
                break;
        }
        return inputStream;
    }


    public static void main(String[] args) throws Exception {
        URL fileUrl = URLUtil.url("C:\\Users\\Administrator\\Desktop\\PlatFormStartup.java");
        InputStream inputStream = fileUrl.openStream();
        System.out.println(IoUtil.toStream(FileUtil.file(fileUrl)));

        URI uri = null;
        String urlStr = "file://C:\\Users\\Administrator\\Desktop\\PlatFormStartup.java";
//        String urlStr = "https://www.baidu.com";
//        String urlStr = "http://www.52lfy.com/data/attachment/forum/202103/16/105746k1fl5wzl5w2xfeg2.jpg";
        URL url = new URL(urlStr);

        //
        inputStream = url.openStream();
        System.out.println(IoUtil.read(inputStream, CharsetUtil.CHARSET_UTF_8));
        //
        inputStream = HttpRequest.get(urlStr).setFollowRedirects(true).executeAsync().bodyStream();
//        System.out.println(IoUtil.read(inputStream, CharsetUtil.CHARSET_UTF_8));

        //        "https://t1.huishahe.com/uploads/tu/201810/9999/62b6b2242c.jpg";

        System.out.println(URLUtil.url(urlStr));
        System.out.println(url.getProtocol());
        System.out.println(URLUtil.url("www.baidu.com"));
        System.out.println(URLUtil.url("D:\\ys\\doc\\开发过程管理1\\项目文档\\NMG\\7-运维阶段"));


        //
//        FileUtil.file(url);


    }


}
